//package com.example.security.filter;
//
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.security.core.userdetails.User;
//import org.springframework.security.core.userdetails.UserDetails;
//import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
//import org.springframework.security.crypto.factory.PasswordEncoderFactories;
//import org.springframework.security.crypto.password.DelegatingPasswordEncoder;
//import org.springframework.security.crypto.password.MessageDigestPasswordEncoder;
//import org.springframework.security.crypto.password.PasswordEncoder;
//import org.springframework.security.provisioning.JdbcUserDetailsManager;
//
//import javax.sql.DataSource;
//import java.sql.Connection;
//import java.sql.SQLException;
//import java.sql.Statement;
//import java.util.HashMap;
//import java.util.Map;
//
///**
// * @className: JdbcSecurityConfig
// * @author: YTF
// * @date: 2025/4/29 23:17
// * @description: JDBC 数据库用户配置
// */
//@Configuration
//public class JdbcSecurityConfig {
//
//    // 1. 数据源配置（改为在 application.yml 中配置）
//    // 无需在此定义 DataSource Bean，Spring Boot 会自动根据配置文件创建
//
//    // 2. 配置密码编码器
//    @Bean
//    public PasswordEncoder passwordEncoder() {
//        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
//    }
//
//    // 3. 配置 JDBC 用户管理器（适配 MySQL）
//    @Bean
//    JdbcUserDetailsManager users(DataSource dataSource) { // 自动注入 MySQL 数据源
//        // 初始化用户表结构（仅首次运行需要）
////        initializeDatabaseSchema(dataSource);
//        // 创建用户（生产环境建议通过注册接口实现）
////        UserDetails user = User.builder()
////                .username("user")
////                .password(passwordEncoder().encode("password")) // 动态加密
////                .roles("USER")
////                .build();
//
////        UserDetails admin = User.builder()
////                .username("admin")
////                .password(passwordEncoder().encode("admin123"))
////                .roles("USER", "ADMIN")
////                .build();
//        //MD5加密方式（注意加密方式不同密码长度也不一致） 不用直接使用MessageDigestPasswordEncoder进行加密这样没前缀 识别密码就会报错
////        Map<String, PasswordEncoder> encoders = new HashMap<>();
////        String encodingId = "MD5";
////        encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5"));
////        String password = new DelegatingPasswordEncoder(encodingId, encoders).encode("md5");
////        UserDetails md5  = User.builder()
////                .username("md5")
////                .password(password)
////                .roles("USER", "ADMIN")
////                .build();
//
//        JdbcUserDetailsManager users = new JdbcUserDetailsManager(dataSource);
////        users.createUser(user);
////        users.createUser(admin);
////        users.createUser(md5);
//        return users;
//    }
//
//    // 初始化数据库表结构（仅需执行一次）
//    private void initializeDatabaseSchema(DataSource dataSource) {
//        try (Connection conn = dataSource.getConnection();
//             Statement stmt = conn.createStatement()) {
//            // MySQL 兼容的表结构（与 H2 语法不同）
//            stmt.executeUpdate("""
//                CREATE TABLE IF NOT EXISTS users (
//                    username VARCHAR(50) NOT NULL PRIMARY KEY,
//                    password VARCHAR(68) NOT NULL, -- BCrypt 需要 60-68 字符长度
//                    enabled BOOLEAN NOT NULL
//                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""");
//
//            stmt.executeUpdate("""
//                CREATE TABLE IF NOT EXISTS authorities (
//                    username VARCHAR(50) NOT NULL,
//                    authority VARCHAR(50) NOT NULL,
//                    FOREIGN KEY (username) REFERENCES users(username)
//                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""");
//        } catch (SQLException e) {
//            throw new RuntimeException("初始化数据库失败", e);
//        }
//    }
//}